-- 终端Key
local terminalKey = KEYS[1];
-- 当前时间戳
local currentTime = ARGV[1];
-- 最大终端数量
local maxTerminalCount = tonumber(ARGV[2]);
-- 用户token的前缀
local tokenPrefix = ARGV[3];
-- 用户Id
local userId = ARGV[4];
-- 用户的过期时间
local expireMilliseconds = ARGV[5];
-- 用户数据
local userData = ARGV[6];

-- 获取已经过期的userIds
local expiredUserIds = redis.call('ZRANGEBYSCORE', terminalKey, '-inf', currentTime);

-- 删除已经过期的userIds
if #expiredUserIds > 0 then
    redis.call('ZREM', terminalKey, table.concat(expiredUserIds, ' '));
end

-- 获取终端的member数量
local terminalCount = redis.call('ZCARD', terminalKey);
-- 如果终端数量大于最大终端数量，则删除最早的终端和对应的userId
--(not(terminalCount)) and
if terminalCount >= maxTerminalCount then
    local earliestTerminal = redis.call('ZRANGE', terminalKey, 0, 0);
    if #earliestTerminal > 0 then
        redis.call("DEL", tokenPrefix .. earliestTerminal[1]);
    end
    redis.call('ZREM', terminalKey, earliestTerminal[1]);
end

-- 存入新的终端和userId
redis.call('ZADD', terminalKey, currentTime + expireMilliseconds, userId);

-- 存入用户数据
redis.call('SET', tokenPrefix .. userId, userData, "PX", expireMilliseconds);

return terminalCount;
